#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H

#include <QWidget>
#include <QScrollArea>
#include <QLabel>

///////////////////////////////////////////////////////////
/// 滚动区域中的 Item 的类型
///////////////////////////////////////////////////////////

enum ItemType {
    SessionItemType,
    FriendItemType,
    ApplyItemType
};

///////////////////////////////////////////////////////////
/// 整个滚动区域的实现
///////////////////////////////////////////////////////////

class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
public:
    explicit SessionFriendArea(QWidget *parent = nullptr);

    // 清空所有的 Item
    void clear();

    // 添加一个 Item 到该区域中，ItemType 表示添加哪种 item，id 跟着 item 的不同也有不同的含义  chatSessionId 和 userId
    void addItem(ItemType itemType, const QString& id, const QIcon& avatar, const QString& name, const QString& text);

    // 选中某个指定的 item，通过 index 下标进行选择
    void clickItem(int index);

private:
    // 后续往 container 内部的 layout 中添加元素，就能够触发 QScrollArea 的滚动效果
    QWidget* container;

signals:
};

///////////////////////////////////////////////////////////
/// 滚动区域中的 Item 的实现
///////////////////////////////////////////////////////////

class SessionFriendItem : public QWidget {
    Q_OBJECT
public:
    SessionFriendItem(QWidget* owner, const QIcon& avatar, const QString& name, const QString& text);

    // 加了这个样式才能生效
    void paintEvent(QPaintEvent* event) override;
    void mousePressEvent(QMouseEvent* event) override;
    void enterEvent(QEnterEvent* event) override;
    void leaveEvent(QEvent* event) override;

    void select();
    // active 函数期望实现 Item 被点击之后的业务逻辑
    virtual void active();

private:
    // onwer 就指向了上述的 SessionFriendArea
    QWidget* owner;

    // 标记当前 Item 是否为选中状态
    bool selected = false;

protected:
    // 让这个成员被子类访问 预览消息
    QLabel* messageLabel;
};

///////////////////////////////////////////////////////////
/// 会话 Item 的实现
///////////////////////////////////////////////////////////

class SessionItem : public SessionFriendItem {
    Q_OBJECT
public:
    SessionItem(QWidget* owner, const QString& chatSessionId, const QIcon& avatar, const QString& name, const QString& lastMessage);

    virtual void active() override;

    void updateLastMessage(const QString& chatSessionId);

private:
    // 当前会话 id
    QString chatSessionId;

    // 最后一条消息的文本预览
    QString text;
};

///////////////////////////////////////////////////////////
/// 好友 Item 的实现
///////////////////////////////////////////////////////////

class FriendItem : public SessionFriendItem {
    Q_OBJECT
public:
    FriendItem(QWidget* owner, const QString& userId, const QIcon& avatar, const QString& name, const QString& signature);

    virtual void active() override;

private:
    // 好友的用户 id
    QString userId;
};

///////////////////////////////////////////////////////////
/// 好友申请 Item 的实现
///////////////////////////////////////////////////////////

class ApplyItem : public SessionFriendItem {
    Q_OBJECT
public:
    ApplyItem(QWidget* owner, const QString& userId, const QIcon& avatar, const QString& name);

    virtual void active() override;

    void acceptFriendApply();
    void rejectFriendApply();

private:
    // 申请人的 id
    QString userId;
};

#endif // SESSIONFRIENDAREA_H
